/*****************HJ-2WD舵机控制*****************
 *  平台：慧净飞卡51小车 + Keil U4 + STC89C52RC
 *  程序名称：智能小车巡黑线源程序(舵机转弯)
 *  公司：慧净电子
 *  淘宝：https://shop37031453.taobao.com/
 *  网站：www.hjmcu.com
 *  晶振:11.0592MHZ
 *  售后技术说明：免费开源，不支持客户自己修改程序分析与改正
 *  视频教程：本小车配套学习C语言详细视频教程，资料统一网盘下载
 ******************************************************************/
/*
 * 下K4(S4)按键，1秒左右启电小车（注意不要接入测速模块）
 * 下复位健可以停止小车
 * 注意程序只做参考之用，要达到最理想的寻迹效果，还需要同学们细心调试。
 * 注意：电机是走不了直线的，需要同学位细心调试PWM 使两边电机转速达到平衡。
 */

#include <AT89X52.H>            /* 包含51单片机头文件，内部有各种寄存器定义 */
#include <HJ-2WD_PWM_FK.H>      /* 飞卡小车专用头文件 */
#define uchar	unsigned char
#define uint	unsigned int

unsigned char n, count, angle;  /* 距离标志位，0.5ms次数，角度标识 */

uchar i;
void DelayUs2x( uchar t )
{
	while ( --t )
		;
}


void DelayMs( uchar t )
{
	while ( t-- )
	{
		/* 大致延时1mS */
		DelayUs2x( 245 );
		DelayUs2x( 245 );
	}
}


/*------------------------------------------------
*                   定时器01初始化
*  //定时器1工作方式1 (舵机 )，定时器0 电机PWM调速控制信号
*  ------------------------------------------------*/
void Time1_Int() interrupt 3    /* 舵机 */
{
	TH1	= 0xff;
	TL1	= 0xa3;
	if ( count < angle )        /* 判断0.5ms次数是否小于角度标识 */
		pwm = 1;                /* 确实小于，pwm输出高电平 */
	else
		pwm = 0;                /* 大于则输出低电平 */
	count	= (count + 1);      /* 0.5ms次数加1 */
	count	= count % 40;       /* 次数始终保持为40即保持周期为20ms */
}


/* 主函数 */
void main( void )
{
	P0	= 0X00;                 /* 关数码管 */
	P1	= 0XF0;                 /* 关电机 */
	/* 本实验学习的按键启动知识 */
	for ( i = 0; i < 50; i++ )  /* 判断K4(S4)是否按下 */
	{
		delay( 1 );         /* 1ms内判断50次，如果其中有一次被判断到K4(S4)没按下，便重新检测 */
		if ( P3_7 != 0 )    /* 当K4(S4)按下时，启动小车前进. P2.7 */
			goto B;         /* 跳转到标号B，重新检测 */
	}
/* 本实验学习的知识蜂鸣器，注意要在HJ-2WD_FK头文件里定义IO口 */
	BUZZ = 0;                   /* 50次检测S4确认是按下之后，蜂鸣器发出“滴”声响，然后启动小车。 */
	delay( 50 );
	BUZZ = 1;                   /* 响50ms后关闭蜂鸣器 */

	TMOD	= 0X11;
	TH0	= 0XFc;                 /* 1ms定时 */
	TL0	= 0X18;
	TR0	= 1;
	ET0	= 1;
	EA	= 1;                    /* 开总中断 */

	TH1	= 0xff;
	TL1	= 0xa3;
	ET1	= 1;
	TR1	= 1;


	while ( 1 )
	{
		/*有信号为0  没有信号为1 */
		if ( Left_1_led == 0 && Right_1_led == 0 )

		{
			run();                                  /* 调用前进函数 */
		}

		if ( Left_1_led == 0 && Right_1_led == 1 )  /* 左边检测到黑线 */

		{
			rightrun();                             /* 调用小车右转函数 */
		}

		if ( Right_1_led == 0 && Left_1_led == 1 )  /* 右边检测到黑线 */

		{
			leftrun();                              /* 调用小车左转函数 */
		}
		if ( Right_1_led == 0 && Left_1_led == 0 )  /* 左右两边同时检测到障碍物 */
		{
			Stoptrun();                             /* 停止800MS（这他娘的根本没有避障啊摔）*/
			delay( 800 );
		}
	}
}